//
//  QQNetworkEngine.h
//  QQNetworkEngine
//
//  Created by elvisgao on 2018/12/11.
//  Copyright © 2018 tencent. All rights reserved.
//

#import "QQNetworkObjectProtocol.h"

@class FBLPromise;

NS_ASSUME_NONNULL_BEGIN

/// QQNetworkEngine相关的错误域
OBJC_EXTERN NSErrorDomain const QQNetworkEngineErrorDomain;

NS_ERROR_ENUM(QQNetworkEngineErrorDomain) {
    QQNetworkEngineErrorDelegateNotIMP = -1,
};

/// userInfo字典中的key。 其value是一个BOOL型的NSNumber，用于表示当前错误是否是后台返回的错误
OBJC_EXTERN NSErrorUserInfoKey const QQNetworkEngineErrorFromServerKey;



@interface QQNetworkEngine : NSObject

/**
 * @param request  请求
 *
 * @return Promise对象，成功的时候value是resp，失败的时候value是error
 */
+ (FBLPromise *)sendRequest:(id<QQNetworkObjectProtocol>)request;

/**
 * @param request  请求
 * @param successBlock 成功的时候回调
 * @param failBlock 失败的时候回调
 * @param cancelBlock 取消的时候回调，目前版本中不会回调
 *
 * @return NSInteger 请求序号，自增的
 */
+ (NSInteger)sendRequest:(id<QQNetworkObjectProtocol>)request
                 success:(nullable void (^)(id response))successBlock
                    fail:(nullable void (^)(id request, NSError *error))failBlock
                  cancel:(nullable void (^)(id request))cancelBlock;
/**
 * @param request  请求
 * @param successBlock 成功的时候回调
 * @param failBlock 失败的时候回调，后台有可能在失败的时候也返回rsp，所以response有可能是nil
 * @param cancelBlock 取消的时候回调，目前版本中不会回调
 *
 *  @return NSInteger 请求序号，自增的
 */
+ (NSInteger)sendRequest:(id<QQNetworkObjectProtocol>)request
            successBlock:(nullable void (^)(id response))successBlock
               failBlock:(nullable void (^)(id _Nullable response, id request, NSError *error))failBlock
             cancelBlock:(nullable void (^)(id request))cancelBlock;
@end

@interface QQNetworkEngine (Utils)

+ (int)generateSeq;

+ (NSString *)generateTraceIdWithUID:(NSString *)uid;

@end

NS_ASSUME_NONNULL_END
